package com.dzu.medium;

/**
 * @author ZhaoDong
 * @date 2022/9/15 10:31
 * @description 665. 非递减数列
 * 给你一个长度为 n 的整数数组 nums ，请你判断在 最多 改变 1 个元素的情况下，该数组能否变成一个非递减数列。
 * <p>
 * 我们是这样定义一个非递减数列的： 对于数组中任意的 i (0 <= i <= n-2)，总满足 nums[i] <= nums[i + 1]。
 * <p>
 *  
 * <p>
 * 示例 1:
 * <p>
 * 输入: nums = [4,2,3]
 * 输出: true
 * 解释: 你可以通过把第一个 4 变成 1 来使得它成为一个非递减数列。
 * 示例 2:
 * <p>
 * 输入: nums = [4,2,1]
 * 输出: false
 * 解释: 你不能在只改变一个元素的情况下将其变为非递减数列。
 *  
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/non-decreasing-array
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Test665 {

    public static void main(String[] args) {
        System.out.println(checkPossibility(new int[]{1, 4, 2, 3}));
    }

    public static boolean checkPossibility(int[] nums) {
        if (nums.length == 1) {
            return true;
        }
        boolean flag = nums[0] <= nums[1]; // 标识是否还能修改

        // 遍历时，每次需要看连续的三个元素
        for (int i = 1; i < nums.length - 1; i++) {
            if (nums[i] > nums[i + 1])  // 出现递减
            {
                if (flag)   // 如果还有修改机会，进行修改
                {
                    if (nums[i + 1] >= nums[i - 1])// 修改方案1
                    {
                        nums[i] = nums[i + 1];
                    } else                            // 修改方案2
                    {
                        nums[i + 1] = nums[i];
                    }
                    flag = false;                   // 用掉唯一的修改机会
                } else        // 没有修改机会，直接结束
                {
                    return false;
                }
            }
        }
        return true;
    }
}
